# coding=utf8

"""
函数是由一些顺序执行的语句组成的对象，可以接受0个或多个参数，并执行语句后返回值
A series of statements which returns some value to a caller. It can also be passed zero or more arguments

函数的完整定义：
funcdef                   ::=  [decorators] "def" funcname "(" [parameter_list] ")"
                               ["->" expression] ":" suite
decorators                ::=  decorator+
decorator                 ::=  "@" assignment_expression NEWLINE
dotted_name               ::=  identifier ("." identifier)*
parameter_list            ::=  defparameter ("," defparameter)* "," "/" ["," [parameter_list_no_posonly]]
                                 | parameter_list_no_posonly
parameter_list_no_posonly ::=  defparameter ("," defparameter)* ["," [parameter_list_starargs]]
                               | parameter_list_starargs
parameter_list_starargs   ::=  "*" [parameter] ("," defparameter)* ["," ["**" parameter [","]]]
                               | "**" parameter [","]
parameter                 ::=  identifier [":" expression]
defparameter              ::=  parameter ["=" expression]
funcname                  ::=  identifier

"""



class Preliminary:

    @staticmethod
    def fun1(a, b=10, c=100):
        """
        该函数包括位置参数a，关键字参数b、c
        位置参数可以按照位置或名称传递值，但都需要符合参数所在的位置
        关键字参数可以按照位置传递值，也可以按照名称传递值
        关键字参数按照名称传递值时，不需要符合顺序
        一个关键字参数之后，不能有位置参数
        :param a:
        :param b:
        :param c:
        :return: a + b + c

        # 按照位置传递参数值
        >>> Preliminary.fun1(1, 2, 3)
        6

        # 使用名称传递值
        >>> Preliminary.fun1(a=10)
        120

        # 使用名称传递关键字参数值
        >>> Preliminary.fun1(10, c=10)
        30
        """
        return a + b + c

    @staticmethod
    def fun2(a, b, *, c=100, d=None):
        """
        在参数列表中使用“*”, 之后的参数都是关键字参数
        如果使用位置参数传递之后的参数，会触发TypeError: fun2() takes 2 positional arguments but 3 were given

        >>> Preliminary.fun2(1, 2)
        102
        >>> Preliminary.fun2(1, 2, d=2)
        2
        """
        if d:
            return a * b
        else:
            return b + c

    @staticmethod
    def fun3(a, b, /, c=100, d=0):
        """
        在参数列表中使用“/”, 之后的参数都是关键字参数
        >>> Preliminary.fun3(1, 2)
        103
        >>> Preliminary.fun3(1, 2, d=2)
        105
        """
        return a+b+c+d



def task():
    """
    >>> task()
    83.5
    86.0
    """
    score_list = [(55, 67, 100), (83, 42, 78), (89, 72, 83)]

    def max2mean(a, b, c):
        sum_score = sum([a, b, c]) - min(a, b, c)
        return sum_score/2

    for sl in score_list:
        if min(sl) < 50:
            continue
        print(max2mean(sl[0], sl[1], sl[2]))


if __name__ == '__main__':
    task()
